WILL CONTAIN INFORMATION; THE REST OF THE FIELDS SHOULD BE IGNORED. ÅACH SUBSEQUENT CALL TO THIS ROUTINE WILL RETURN THE NEXT DIRECTORY ENTRY IN THE DIRECTORY. ÁLL OF THE "DIRENT" FIELDS WILL BE VALID FOR THESE. ÔHEN, AFTER ALL DIRECTORY ENTRIES HAVE BEEN READ THROUGH, THE LAST CALL WILL RETURN A DIRECTORY ENTRY WITH A NULL (ZERO-LENGTH) NAME. ÔHIS CORRESPONDS TO THE "BLOCKS FREE" LINE IN A ÃOMMODORE DISK DIRECTORY LISTING. ÔHE "ACEÄIRENTÂYTES" FIELD FOR THIS LAST ENTRY WILL BE SET TO THE NUMBER OF BYTES AVAILABLE FOR STORAGE ON THE DISK. ÏN A ÃOMMODORE DISK DRIVE, THIS WILL BE THE NUMBER OF BLOCKS FREE MULTIPLIED BY 254. ÁFTER READING THIS LAST ENTRY, YOU SHOULD CLOSE THE DIRECTORY. ÁT ANY TIME, IF SOMETHING BIZARRE HAPPENS TO THE LISTING FROM THE DISK THAT IS NOT CONSIDERED AN ERROR (É DON'T ACTUALLY KNOW IF THIS IS POSSIBLE OR NOT), THEN THE .Ú FLAG WILL BE SET, INDICATING THE ABRUPT ENDING OF THE DIRECTORY LISTING. ÎÁÍÅ : ISDIR ÐÕÒÐÏÓÅ: DETERMINE WHETHER THE GIVEN PATHNAME IS FOR A FILE OR A DIRECTORY ÁÒÇÓ : (ZP) = PATHNAME ÒÅÔÕÒÎÓ: .Á = DEVICE IDENTIFIER .Ø = IS A DISK DEVICE FLAG .Ù = IS A DIRECTORY FLAG .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : ERRNO ÇIVEN A PROPERLY FORMATTED DIRECTORYNAME OR FILENAME, THIS ROUTINE WILL RETURN WHETHER THE NAME IS FOR A FILE OR A DIRECTORY, WHETHER THE DEVICE OF THE FILE OR DIRECTORY IS A DISK OR CHARACTER DEVICE, AND THE SYSTEM IDENTIFIER FOR THE DEVICE. ÔHE TWO FLAGS RETURN $ÆÆ FOR TRUE AND $00 FOR FALSE. ÔHE DEVICE IDENTIFIER IS SUPERFLUOUS FOR NOW, BUT A "DEVINFO" CALL MAY BE ADDED LATER. ÎOTE THAT THIS FILE DOES NOT INDICATE WHETHER THE FILE/DIRECTORY ACTUALLY EXISTS OR NOT. ÎÁÍÅ : CHDIR ÐÕÒÐÏÓÅ: CHANGE THE CURRENT WORKING DIRECTORY ÁÒÇÓ : (ZP) = NEW DIRECTORY PATHNAME ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃHANGES THE CURRENT WORKING DIRECTORY TO THE NAMED DIRECTORY. ÔOO BAD THE ÃOMMODORE ËERNAL DOESN'T HAVE A SIMILAR CALL. ÕNLIKE THE "CD" SHELL COMMAND, THE ARGUMENT HAS TO BE A PROPERLY FORMATTED DIRECTORY NAME. ÎOTE THAT ONLY DIRECTORIES IN NATIVE PARTITIONS ON ÃÍÄ DEVICES ARE SUPPORTED BY THIS COMMAND; THE 1581'S CRUMMY IDEA OF PARTITIONS IS NOT SUPPORTED. ÎÁÍÅ : CDHOME ÐÕÒÐÏÓÅ: CHANGE THE CURRENT WORKING DIRECTORY BACK TO THE "HOME" DIRECTORY ÁÒÇÓ : ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃHANGES THE CURRENT WORKING DIRECTORY BACK TO THE "HOME" DIRECTORY THAT IS DEFINED IN THE "CONFIG.SYS" FILE AS THE INITIAL DIRECTORY. ÎÁÍÅ : MKDIR ÐÕÒÐÏÓÅ: CREATE A NEW DIRECTORY ÁÒÇÓ : (ZP) = PATHNAME OF NEW DIRECTORY ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃREATES A NEW DIRECTORY. É'M NOT SURE, BUT É THINK THAT THE CURRENT DIRECTORY HAS TO BE THE PARENT DIRECTORY OF THE DIRECTORY YOU WANT TO CREATE. ÔHIS MAY BE REQUIRED BY ÃÍÄ DEVICES, WHICH WILL BE THE LOWEST COMMON DENOMINATOR FOR DIRECTORY SUPPORT. [ÎOTE: THIS CALL IS NOT IMPLEMENTED IN ÒELEASE #9]. ÎÁÍÅ : RMDIR ÐÕÒÐÏÓÅ: DELETE AN EMPTY EXISTING DIRECTORY ÁÒÇÓ : (ZP) = PATHNAME OF EMPTY DIRECTORY TO REMOVE ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÄELETES AN EXISTING DIRECTORY. ÔHE DIRECTORY MUST BE EMPTY (HAVE NO DIRECTORY ENTRIES) IN ORDER FOR THIS COMMAND TO SUCCEED. ÁGAIN, É AM PRETTY SURE THAT YOU HAVE TO BE "IN" THE PARENT DIRECTORY OF THE ONE TO BE DELETED, SINCE THIS IS PROBABLY REQUIRED BY ÃÍÄ DEVICES. [ÎOTE: THIS CALL IS NOT IMPLEMENTED IN ÒELEASE #9]. 2.3. ÍÅÍÏÒÙ ÃÁÌÌÓ ÔHE CALLS GIVEN IN THIS SECTION ARE TO BE USED FOR ACCESSING "FAR" MEMORY IN ÁÃÅ, WHICH INCLUDES ALL ÒÅÕ, ÒÁÍÌINK, ÒÁÍ1 AND ABOVE, AND SECTIONS OF ÒÁÍ0 THAT ARE NOT IN THE APPLICATION PROGRAM AREA. ÁPPLICATIONS ARE NOT ALLOWED TO ACCESS "FAR" MEMORY DIRECTLY, BECAUSE THE PRACTICE OF BYPASSING THE OPERATING SYSTEM WOULD UNDOUBTEDLY LEAD TO PROBLEMS (CAN YOU SAY "ÍÓ-ÄÏÓ"?). ÁLL OF THESE CALLS USE A 32-BIT POINTER THAT IS STORED IN THE ZERO-PAGE ARGUMENT FIELD "MP" (MEMORY POINTER). ÔHIS FIELD IS TO BE INTERPRETED AS CONSISTING OF LOW AND HIGH WORDS. ÔHE LOW WORD, WHICH OF COURSE COME FIRST, IS THE OFFSET INTO THE MEMORY "BANK" THAT IS CONTAINED IN THE HIGH WORD. ÕSERS MAY ASSUME THAT OFFSETS WITHIN A BANK ARE CONTINUOUS, SO OPERATIONS LIKE ADDITION MAY BE PERFORMED WITHOUT FEAR ON OFFSETS, TO ACCESS SUBFIELDS OF A STRUCTURE, FOR EXAMPLE. ÙOU MAY NOT, HOWEVER, MAKE ANY INTERPRETATION OF THE BANK WORD. ÁN APPLICATION SHOULD ONLY ACCESS FAR MEMORY THAT IT HAS ALLOCATED FOR ITSELF VIA THE "PAGEALLOC" CALL. ÎÁÍÅ : ZPLOAD ÁÒÇÓ : [MP] = SOURCE FAR MEMORY POINTER .Ø = DESTINATION ZERO-PAGE ADDRESS .Ù = TRANSFER LENGTH ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÌOAD ZERO-PAGE LOCATIONS WITH THE CONTENTS OF FAR MEMORY. "MP", OF COURSE, GIVES THE ADDRESS OF THE FIRST BYTE OF FAR MEMORY TO BE RETRIEVED. ÔHE Ø REGISTER IS LOADED WITH THE FIRST ADDRESS OF THE STORAGE SPACE FOR THE DATA ON ZERO PAGE. ÉT MUST BE IN THE APPLICATION ZERO-PAGE SPACE. ÔHE Ù REGISTER HOLDS THE NUMBER OF BYTES TO BE TRANSFERRED, WHICH, CONSIDERING THAT TRANSFERS MUST BE TO THE APPLICATION ZERO-PAGE STORAGE, MUST BE 126 BYTES OR LESS. ÔHIS ROUTINE WILL RETURN A "REFERENCE THROUGH NULL POINTER" IF [MP] CONTAINS A NULL POINTER. ÎÁÍÅ : ZPSTORE ÁÒÇÓ : .Ø = SOURCE ZERO-PAGE ADDRESS [MP] = DESTINATION FAR MEMORY POINTER .Ù = TRANSFER LENGTH ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS ROUTINE IS THE COMPLEMENT OF "ZPLOAD"; THIS TRANSFERS DATA FROM ZERO PAGE TO FAR MEMORY. ÔHE ARGUMENTS AND RESTRICTIONS ARE THE SAME AS "ZPLOAD". ÎÁÍÅ : FETCH ÁÒÇÓ : [MP] = SOURCE FAR MEMORY POINTER (ZP) = DESTINATION ÒÁÍ0 POINTER .ÁÙ = TRANSFER LENGTH ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS ROUTINE WILL FETCH UP TO 64Ë OF DATA FROM FAR MEMORY INTO ÒÁÍ0 MEMORY WHERE IT CAN BE ACCESSED DIRECTLY BY THE PROCESSOR. ÔHE ARGUMENTS SHOULD MOSTLY SPEAK FOR THEMSELVES. ÙOU SHOULD NOT FETCH INTO ÒÁÍ0 MEMORY THAT IS NOT SPECIFICALLY ALLOCATED TO THE APPLICATION. ÙOU WILL GET AN ERROR IF YOU TRY TO USE A NULL FAR POINTER. ÎÁÍÅ : STASH ÁÒÇÓ : (ZP) = SOURCE ÒÁÍ0 POINTER [MP] = DESTINATION FAR MEMORY POINTER .ÁÙ = TRANSFER LENGTH ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS IS THE COMPLEMENT OF "FETCH" AND OPERATES ANALOGOUSLY, EXCEPT THAT IT TRANSFERS DATA FROM ÒÁÍ0 TO FAR MEMORY. ÎÁÍÅ : PAGEALLOC ÁÒÇÓ : .Á = REQUESTED NUMBER OF PAGES TO BE ALLOCATED .Ø = STARTING "TYPE" OF MEMORY TO SEARCH .Ù = ENDING "TYPE" OF MEMORY TO SEARCH, INCLUSIVE ÒÅÔÕÒÎÓ: [MP] = FAR MEMORY POINTER TO START OF ALLOCATED MEMORY .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS ROUTINE ALLOCATES A GIVEN NUMBER OF CONTIGUOUS FAR-MEMORY PAGES FOR USE BY THE APPLICATION, AND RETURNS A POINTER TO THE FIRST BYTE OF THE FIRST PAGE. ÏN CALLING, THE ACCUMULATOR CONTAINS THE NUMBER OF PAGES TO ALLOCATE (A PAGE IS 256 CONTIGUOUS BYTES ALIGNED ON A 256-BYTE ADDRESS (I.E., THE LOW BYTE OF A PAGE ADDRESS IS ALL ZEROS)). ÔHE Ø AND Ù REGISTERS CONTAIN THE START AND END "TYPES" OF FAR MEMORY TO SEARCH FOR THE REQUIRED ALLOCATION. ÔHE POSSIBLE TYPES ARE MENTIONED IN THE ÓYSTEM ÃONSTANTS SECTION. ÔHE NUMERIC VALUES FOR THE "ACEÍEM" CONSTANTS ARE ARRANGED IN ORDER OF ACCESSING SPEED. ÓO, IF YOUR APPLICATION HAS SPEED REQUIREMENTS THAT DICTATE, FOR EXAMPLE, THAT ÒÁÍÌINK MEMORY SHOULD NOT BE USED, THEN YOU WOULD CALL "PAGEALLOC" WITH A SEARCH RANGE OF .Ø=0 TO .Ù=ACEÍEMÉNTERNAL. ÉF YOU WANTED TO SAY YOU ARE WILLING TO ACCEPT ANY MEMORY THE SYSTEM CAN GIVE TO YOU, YOU WOULD SPECIFY .Ø=0 TO .Ù=255. ÔHE VALUES OF 0 AND 255 WILL BE CONVERTED TO THE FASTEST AND SLOWEST MEMORY AVAILABLE. ÁÃÅ WILL GIVE YOU THE FASTEST TYPE OF MEMORY, FROM WHAT YOU SPECIFY AS ACCEPTABLE, THAT IT CAN. ÉF YOU HAD AN APPLICATION THAT YOU DIDN'T WANT TO WASTE THE HIGH-SPEED MEMORY ON, YOU COULD FIRST CALL "PAGEALLOC" ASKING FOR SLOW MEMORY, SUCH AS .Ø=ACEÍEMÒÌÒÅÕ TO .Ù=255, AND IF THERE IS NONE OF THAT TYPE OF MEMORY LEFT, MAKE ANOTHER CALL WITH .Ø=0 TO .Ù=ACEÍEMÒÌÒÅÕ-1. ÔHIS ROUTINE WILL THEN SEARCH ITS AVAILABLE FREE MEMORY FOR A CHUNK FITTING YOUR SPECIFICATIONS. ÉF IT CANNOT FIND ONE, THE ROUTINE WILL RETURN A "INSUFFICIENT MEMORY" ERROR AND A NULL POINTER. ÎOTE THAT THIS ERROR MAY OCCUR IF THERE IS ACTUALLY THE CORRECT AMOUNT OF MEMORY FREE BUT JUST NOT IN A BIG ENOUGH CONTIGUOUS CHUNK. ÉF SUCCESSFUL, THIS ROUTINE WILL RETURN IN "MP" A POINTER TO THE FIRST BYTE OF THE FIRST PAGE OF THE ALLOCATED MEMORY. ÉF YOU CALL A SUBPROGRAM WITH THE "EXEC" CALL WHILE THE CURRENT PROGRAM IS HOLDING FAR MEMORY, THAT FAR MEMORY WILL BE KEPT ALLOCATED TO YOUR PROGRAM AND WILL BE SAFE WHILE THE CHILD PROGRAM IS EXECUTING. ÉF YOU DON'T DEALLOCATE THE MEMORY WITH "PAGEFREE" BEFORE EXITING BACK TO YOUR PARENT PROGRAM, THEN THE SYSTEM WILL AUTOMATICALLY DEALLOCATE ALL MEMORY ALLOCATED TO YOU. ÓO, HAVE NO FEAR ABOUT CALLING "EXIT" IF YOU ARE IN THE MIDDLE OF COMPLICATED FAR MEMORY MANIPULATION WHEN A FATAL ERROR CONDITION IS DISCOVERED AND YOU DON'T FEEL LIKE FIGURING OUT WHAT MEMORY YOUR PROGRAM OWNS AND DEALLOCATING IT. ÓOME APPLICATIONS WILL WANT TO HAVE THE MOST AMOUNT OF MEMORY TO WORK WITH, AND IF THERE IS FREE SPACE IN THE APPLICATION PROGRAM AREA THAT THE PROGRAM IS NOT USING DIRECTLY, THEN YOU MAY WANT TO USE THAT AS "FAR" MEMORY. ÔO DO THIS, YOU WILL NEED TO WRITE YOUR OWN STUB ROUTINES THAT MANAGE PAGE ALLOCATION AND DEALLOCATION REQUESTS TO THE NEAR MEMORY, AND CALLS THE "PAGEALLOC" AND "PAGEFREE" ROUTINES TO MANAGE THE FAR MEMORY. ÔHE "SORT" PROGRAM DISTRIBUTED WITH ÁÃÅ DOES THIS. ÐLEASE NOTE THAT YOU ÃÁÎÎÏÔ SIMPLY FREE THE UNUSED MEMORY OF THE APPLICATION PROGRAM AREA AND EXPECT THE SYSTEM TO MANAGE IT. ÂAD STUFF WOULD HAPPEN. ÓOME APPLICATIONS WILL WANT TO HAVE A BYTE-ORIENTED MEMORY ALLOCATION SERVICE RATHER THAN A PAGE-ORIENTED SERVICE. ÙOU CAN BUILD A BYTE-ORIENTED SERVICE ON TOP OF THE PAGE-ORIENTED SERVICE IN YOUR APPLICATION PROGRAMS THAT MANAGE MEMORY FOR THE APPLICATION AND ASK THE SYSTEM FOR PAGES WHENEVER MORE MEMORY IS REQUIRED BY THE APPLICATION. ÎOTE THAT THIS STILL MEANS THAT ALLOCATED MEMORY WILL BE FREED AUTOMATICALLY WHEN AN APPLICATION EXITS. ÔHE "SORT" PROGRAM IMPLEMENTS THIS BYTE-ORIENTED SERVICE, SO YOU CAN CHECK ITS SOURCE CODE TO SEE HOW THIS IS DONE (OR TO SIMPLY CUT AND PASTE THE CODE INTO YOUR OWN PROGRAM). ÎÁÍÅ : PAGEFREE ÁÒÇÓ : [MP] = FAR MEMORY POINTER TO START OF MEMORY TO BE FREED .Á = NUMBER OF PAGES TO BE FREED ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS DEALLOCATES MEMORY THAT WAS ALLOCATED TO A PROCESS BY USING THE "PAGEALLOC" SYSTEM CALL. ÙOU WILL GET AN ERROR RETURN IF YOU TRY TO DEALLOCATE MEMORY THAT YOU DON'T OWN. 2.4. ÓÃÒÅÅÎ ÃÏÎÔÒÏÌ ÃÁÌÌÓ ÔHIS SECTION DESCRIBES THE SYSTEM CALLS THAT ARE AVAILABLE TO APPLICATION PROGRAMMERS FOR FULL-SCREEN APPLICATIONS. ÔHESE CALLS ARE INTENDED TO BE GENERAL ENOUGH TO HANDLE DIFFERENT SCREEN HARDWARE (THE ÖÉà AND ÖÄà CHIPS AND A ÖÉà SOFT-80-COLUMN BITMAP SCREEN, AND POSSIBLY OTHERS). ÔHESE CALLS ARE ALSO DESIGNED TO BE EFFICIENT AS POSSIBLE, TO DISCOURAGE PROGAMMERS FROM ATTEMPTING TO BYPASS USING THEM. ÂYPASSING THESE CALLS WOULD BE A BAD THING. ÔHE CALLS ARE DESIGNED AROUND THE Ã-128/ÐÅÔ CONCEPT OF A WINDOW. ÔHERE IS ONLY ONE ACTIVE WINDOW ON THE DISPLAY AT A TIME, WHICH MAY BE IS LARGE AS THE ENTIRE SCREEN OR AS SMALL AS 1X1 CHARACTER CELLS. ÔHIS WINDOW IS VERY CHEAP TO SETUP AND TEAR DOWN. ÁN APPLICATION CAN HAVE MULTIPLE WINDOWS ON THE SCREEN BY SWITCHING THE ACTIVE WINDOW AROUND. ÉN THE CALLS BELOW, ALL MENTION OF "SW" IN THE ARGUMENTS AND RETURN VALUES REFER TO THE "SYSWORK" ARRAY. ÆOR MANY CALLS, THERE IS A "CHAR/COLOR/ HIGH-ATTRIBUTE" ARGUMENT. ÔHIS ARGUMENT DETERMINES WHICH PARTS OF A SCREEN LOCATION WILL BE MODIFIED. ÔHERE ARE THREE COMPONENTS TO EACH SCREEN LOCATION: THE CHARACTER CODE, THE COLOR CODE, AND THE HIGH-ATTRIBUTES. ÔHE CHARACTER CODE IS EXACTLY THE SAME AS THE ÐÅÔÓÃÉÉ CODE FOR THE CHARACTER THAT YOU WANT TO DISPLAY (UNLIKE THE SCREEN-CODE ARRANGEMENT THAT ÃOMMODORE CHOSE). ÔHERE ARE 128 INDIVIDUAL CHARACTERS IN THE NORMAL ÐÅÔÓÃÉÉ POSITIONS, AND 128 REVERSED IMAGES OF THE CHARACTERS IN THE MOST SENSIBLE OTHER POSITIONS. ÔHE CODES ARE AS FOLLOWS: ÃÏÄÅÓ (HEX) ÄÅÓÃÒÉÐÔÉÏÎ ----------- ----------- $00-$1F REVERSE LOWERCASE LETTERS $20-$3F DIGITS AND PUNCTUATION $40-$5F LOWERCASE LETTERS $60-$7F REVERSE GRAPHICS CHARACTERS $80-$9F REVERSE UPPERCASE LETTERS $A0-$BF GRAPHICS CHARACTERS $C0-$DF UPPERCASE LETTERS $E0-$EF REVERSE DIGITS AND PUNCTUATION ÔHERE ARE SIXTEEN COLOR CODES, OCCUPYING THE LOWER FOUR BITS OF THE COLOR VALUE. ÔHESE ARE ÒÇÂÉ CODES, AS FOLLOWS: ÃÏÄÅ(DEC) (HEX) (BIN) ÄÅÓÃÒÉÐÔÉÏÎ --------- ----- -RGBI ----------- 0 $0 %0000 BLACK 1 $1 %0001 DARK GREY 2 $2 %0010 BLUE 3 $3 %0011 LIGHT BLUE 4 $4 %0100 GREEN 5 $5 %0101 LIGHT GREEN 6 $6 %0110 DARK CYAN ON ÖÄÃ, MEDIUM GREY ON ÖÉÃ-ÉÉ 7 $7 %0111 CYAN 8 $8 %1000 RED 9 $9 %1001 LIGHT RED 10 $A %1010 PURPLE 11 $B %1011 LIGHT PURPLE ON ÖÄÃ, ORANGE ON ÖÉÃ-ÉÉ 12 $C %1100 BROWN 13 $D %1101 YELLOW 14 $E %1110 LIGHT GREY 15 $F %1111 WHITE ÆINALLY, THERE ARE THE HIGH-ATTRIBUTE BITS. ÔHESE OCCUPY THE FOUR MOST SIGNIFICANT BITS OF THE COLOR VALUE. ÄEPENDING ON THE TYPE OF DISPLAY (ÖÉà TEXT, ÖÄà TEXT, OR ÖÉÃ/ÖÄà BITMAP), THESE BITS HAVE ONE OF THREE MEANINGS: CHARACTER ATTRIBUTES, BACKGROUND CHARACTER COLOR, OR NO EFFECT. ÔHUS, CARE MUST BE TAKEN IN USING THESE BITS; THEY WILL HAVE DIFFERENT EFFECTS ON DIFFERENT DISPLAYS. ÔHE BACKGROUND CHARACTER CODES ARE THE SAME AS THE FOREGROUND CHARACTER CODES LISTED ABOVE. ÔHE CHARACTER ATTRIBUTES HAVE THE FOLLOWING MEANINGS: ÂÉÔ ÖÁÌÕÅ (DEC) (HEX) ÄÅÓÃÒÉÐÔÉÏÎ -AVUB---- ----- ----- ----------- %10000000 128 $80 ALTERNATE CHARACTERSET (ITALIC) %01000000 64 $40 REVERSE CHARACTER %00100000 32 $20 UNDERLINE %00010000 16 $10 BLINK ÔHESE VALUES ARE ADDITIVE (OR, SHOULD É SAY, "OR-ATIVE"); YOU CAN USE ANY COMBINATION OF THEM AT ONE TIME. ÎORMALLY, YOU MAY WISH TO LEAVE THE HIGH-ATTRIBUTE BITS ALONE, UNLESS YOU TAKE THE VALUES TO GIVE THEM FROM THE COLOR PALETTES (NEXT SECTION). ÔO SPECIFY WHICH OF YOU WISH TO HAVE CHANGED, SET BITS IN THE "CHAR/COLOR/HIGH-ATTRIBUTE" ARGUMENT TO SYSTEM CALLS. ÔHE FLAGS HAVE THE FOLLOWING VALUES. ÔHEY ARE OR-ATIVE AS WELL: ÂÉÔ ÖÁÌÕÅ (DEC) (HEX) ÄÅÓÃÒÉÐÔÉÏÎ -CAH----- ----- ----- ----------- %10000000 128 $80 MODIFY CHARACTER %01000000 64 $40 MODIFY COLOR %00100000 32 $20 MODIFY HIGH-ATTRIBUTE BITS ÔHE SCREEN CALLS THAT DEAL WITH PLACING CHARACTERS ON THE SCREEN REFER TO SCREEN LOCATIONS USING ABSOLUTE ADDRESSES OF LOCATIONS IN SCREEN MEMORY. ÔHIS SCHEME IS USED FOR INCREASED EFFICIENCY. ÙOU CAN OBTAIN INFORMATION ABOUT THE ABSOLUTE SCREEN ADDRESS OF THE TOP LEFT-HAND CORNER OF THE CURRENT WINDOW AND THE NUMBER OF SCREEN ADDRESSES BETWEEN SUCCESSIVE ROWS, TO FIGURE OUT SCREEN ADDRESSES FOR YOUR APPLICATIONS. ÆOR ADDED CONVENIENCE, THERE IS A CALL WHICH WILL ACCEPT ROW AND COLUMN NUMBERS AND RETURN THE CORRESPONDING ABSOLUTE SCREEN ADDRESS. ÔHE SCREEN-CONTROL SYSTEM CALLS ARE AS FOLLOWS: ÎÁÍÅ : WINMAX ÁÒÇÓ : ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÓETS THE CURRENT WINDOW TO COVER THE ENTIRE SCREEN. ÎÁÍÅ : WINCLEAR ÁÒÇÓ : .Á = CHAR/COLOR/HIGH-ATTRIBUTE MODIFICATION FLAGS .Ø = CHARACTER FILL VALUE .Ù = COLOR FILL VALUE ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÔHIS CALL "CLEARS" THE CURRENT WINDOW BY FILLING IT WITH THE CHARACTER/COLOR YOU SPECIFY. ÙOU CAN USE THE CHAR/COLOR/HI-ATTR TO LIMIT WHAT GETS CLEARED. [ÎOTE: ÔHE ARGUMENTS FOR THIS CALL ARE SLIGHTLY DIFFERENT IN ÒELEASE #9]. ÎÁÍÅ : WINSET ÁÒÇÓ : .Á = NUMBER OF ROWS IN WINDOW .Ø = NUMBER OF COLUMNS IN WINDOW SW+0 = ABSOLUTE SCREEN ROW OF TOP LEFT CORNER OF WINDOW SW+1 = ABSOLUTE SCREEN COLUMN OF TOP LEFT CORNER OF WINDOW ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÓETS THE CURRENT WINDOW TO THE SIZE YOU SPECIFY. ÙOU WILL GET AN ERROR RETURN IF THE WINDOW WILL NOT FIT ON THE SCREEN OR OF IT DOES NOT CONTAIN AT LEAST ONE CHARACTER. [ÎOTE: ÔHIS CALL IS NOT IMPLEMENTED IN ÒELEASE #9]. ÎÁÍÅ : WINSIZE ÁÒÇÓ : ÒÅÔÕÒÎÓ: .Á = NUMBER OF ROWS IN WINDOW .Ø = NUMBER OF COLUMNS IN WINDOW SW+0 = ABSOLUTE SCREEN ROW OF TOP LEFT CORNER OF WINDOW SW+1 = ABSOLUTE SCREEN COLUMN OF TOP LEFT CORNER OF WINDOW (SW+2)= SCREEN ADDRESS OF TOP LEFT CORNER (SW+4)= SCREEN ADDRESS INCREMENT BETWEEN SUCCESSIVE ROWS ON SCREEN ÁÌÔÅÒÓ : ÒETURNS INFORMATION ABOUT THE CURRENT WINDOW. [ÎOTE: THE ARGUMENTS ARE SLIGHTLY DIFFERENT IN ÒELEASE #9]. ÎÁÍÅ : WINPUT ÁÒÇÓ : (SW+0)= ABSOLUTE SCREEN ADDRESS TO START PUTTING DATA AT (SW+2)= CHARACTER STRING POINTER .Ø = LENGTH OF CHARACTER STRING .Ù = COLOR .Á = CHAR/COLOR/HIGH-ATTRIBUTE MODIFICATION FLAGS SW+4 = FILL CHARACTER SW+5 = TOTAL FIELD LENGTH ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÐUTS TEXT ONTO THE SCREEN. ÔHE OUTPUT REGION IS GIVEN BY THE ABSOLUTE STARTING SCREEN ADDRESS AND THE TOTAL FIELD LENGTH. ÔHIS REGION MUST BE CONTAINED ON ONE LINE OF THE CURRENT WINDOW, OR BAD THINGS WILL HAPPEN. Á POINTER TO THE CHARACTERS TO BE PRINTED IS GIVEN, AS WELL AS THE LENGTH OF THE CHARACTER ARRAY. ÃONTROL CHARACTERS IN THIS STRING ARE IGNORED; THEY ARE POKED LITERALLY ONTO THE SCREEN, INCLUDING THE NULL CHARACTER. ÔHE LENGTH OF THE CHARACTER STRING MUST BE LESS THAN OR EQUAL TO THE TOTAL LENGTH OF THE FIELD. ÒEMAINING SPACES IN THE FIELD WILL BE FILLED IN WITH THE "FILL CHARACTER". ÔHE COLOR OF THE TOTAL FIELD LENGTH WILL BE FILLED IN WITH "COLOR". ÙOU CAN USE THE "CHAR/COLOR/HI-ATTR" MODIFICATION FLAGS TO SPECIFY WHAT IS TO BE CHANGED. ÉF YOU WERE TO, FOR EXAMPLE, SPECIFY THAT THE COLORS OF THE FIELD ARE NOT TO BE CHANGED, THEN THE CALL WOULD EXECUTE FASTER. ÎÁÍÅ : WINCOLOR ÁÒÇÓ : .Ø = NEW ÒÇÂÉ SCREEN COLOR .Ù = NEW ÒÇÂÉ BORDER COLOR .Á = WHICH COLORS TO CHANGE ($80=SCREEN + $40=BORDER) ÒÅÔÕÒÎÓ: .Ø = RESULTING ÒÇÂÉ SCREEN COLOR .Ù = RESULTING ÒÇÂÉ BORDER COLOR ÁÌÔÅÒÓ : .Á ÓETS THE COLOR OF THE SCREEN AND BORDER. ÙOU MAY OPTIONALLY SET ONE, THE OTHER, BOTH, OR NEITHER. ÔHE RESULTING COLORS FOR COLORS CHANGED, AND THE EXISTING COLORS FOR COLORS UNCHANED WILL BE RETURNED. ÎOTE THAT NOT ALL SCREENS HAVE AN ADJUSTABLE COLOR, SO THE BORDER ARGUMENT MAY BE IGNORED. ÎÁÍÅ : WINPOS ÁÒÇÓ : .Á = ROW .Ø = COLUMN ÒÅÔÕÒÎÓ: (SW+0)= SCREEN MEMORY ADDRESS OF POSITION ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÇIVEN A ROW AND COLUMN IN THE CURRENT WINDOW, RETURNS THE CORRESPONDING ABSOLUTE SCREEN MEMORY LOCATION FOR USE WITH OTHER CALLS. ÎO ERRORS ARE RETURNED, SO GARBAGE IN, GARBAGE OUT. ÎÁÍÅ : WINCURSOR ÁÒÇÓ : (SW+0)= SCREEN ADDRESS TO PLACE CURSOR .Á = ENABLE FLAG ($FF=CURSOR-ON / $00=CURSOR-OFF) .Ù = COLOR TO SHOW CURSOR IN ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÄISPLAYS OR UNDISPLAYS THE CURSOR AT THE GIVEN SCREEN ADDRESS. ÔHIS CALL RETURNS IMMEDIATELY IN EITHER CASE. ÎO ERRORS ARE RETURNED. ÄO NOT DISPLAY ANYTHING IN OR SCROLL THE WINDOW WHILE THE CURSOR IS BEING DISPLAYED, DO NOT DISPLAY THE CURSOR TWICE, AND DO NOT UNDISPLAY THE CURSOR TWICE IN A ROW OR BAD THINGS WILL HAPPEN. ÁLSO, MAKE SURE YOU GIVE THE SAME ADDRESS WHEN UNDISPLAYING THE CURSOR AS YOU DID WHEN DISPLAYING THE CURSOR. ×HEN THE SYSTEM STARTS, THE CURSOR WILL BE IN ITS UNDISPLAYED STATE (DUH!). ÙOU ALSO GET TO SPECIFY THE COLOR YOU WANT THE CURSOR TO BE SHOWN IN. ÔHE HIGH-ATTRIBUTE BITS OF THIS COLOR ARE IGNORED. ÎÁÍÅ : WINSCROLL ÁÒÇÓ : .Á = FLAGS: CHAR/COLOR/HI-ATTR + $08=UP + $04=DOWN .Ø = NUMBER OF ROWS TO SCROLL UP/DOWN SW+4 = FILL CHARACTER .Ù = FILL COLOR ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÓCROLLS THE CONTENTS OF THE CURRENT WINDOW UP OR DOWN. ÙOU CAN SCROLL ANY NUMBER OF ROWS AT A TIME. ÁFTER SCROLLING, THE BOTTOM (OR TOP) ROWS WILL BE FILLED WITH THE FILL CHARACTER AND COLOR. ÙOU CAN LIMIT WHETHER THE CHARACTERS AND/OR COLORS ARE TO BE SCROLLED BY USING THE "FLAGS" BYTE IN THE USUAL WAY. ÓCROLLING ONLY THE CHARACTERS, FOR EXAMPLE, WILL BE TWICE AS FAST AS SCROLLING BOTH CHARACTERS AND ATTRIBUTES. ×HETHER TO SCROLL UP OR DOWN IS SPECIFIED ALSO USING BITS IN THE "FLAGS" FIELD, AS INDICATED IN THE INPUT ARGUMENTS ABOVE. ÙOU CAN SPECIFY SCROLLING IN MORE THAN ONE WAY, AND THE RESULT WILL BE TO SCROLL IN EACH SPECIFIED DIRECTION IN TURN, IN THE ORDER UP, THEN DOWN. ÉN THE FUTURE, SCROLLING LEFT AND RIGHT MAY BE ADDED TO THIS CALL. [ÎOTE: ÔHE ARGUMENTS AND SEMANTICS OF THIS CALL ARE A LITTLE DIFFERENT IN ÒELEASE #9]. 2.5. ÃÏÎÓÏÌÅ ÃÁÌÌÓ ÔHE CALLS IN THIS SECTION REFER TO THE SYSTEM "CONSOLE", WHICH INCLUDES THE SCREEN AND KEYBOARD. ÔHE SCREEN-RELATED CALLS ARE AT A HIGHER LEVEL THAN THE CALLS IN THE PREVIOUS SECTION. ÎÁÍÅ : STOPKEY ÁÒÇÓ : ÒÅÔÕÒÎÓ: .ÃÓ = STOP KEY PRESSED ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÉNDICATES WHETHER THE ÓÔÏÐ (ÒÕÎ/ÓÔÏÐ) KEY IS CURRENTLY BEING HELD DOWN BY THE USER. ÉF SO, CARRY FLAG IS SET ON RETURN (AND CLEAR IF NOT). ÉF THE STOP KEY IS DISCOVERED TO BE PRESSED BY THIS CALL, THEN THE KEYBOARD BUFFER WILL ALSO BE CLEARED. ÎÁÍÅ : GETKEY ÁÒÇÓ : ÒÅÔÕÒÎÓ: .Á = KEYBOARD CHARACTER ÁÌÔÅÒÓ : .Ø, .Ù ×AITS FOR THE USER TO TYPE A KEY (OR TAKES A PREVIOUS KEYSTROKE FROM THE KEYBOARD BUFFER). ÒEGULAR CHARACTERS ARE RETURNED IN THEIR REGULAR ÐÅÔÓÃÉÉ CODES, BUT THERE ARE MANY SPECIAL CONTROL KEYSTROKES. ÔHEY ARE NOT LISTED HERE (YET) BECAUSE É HAVEN'T FIGURED OUT WHAT ALL OF THE SPECIAL CODES SHOULD BE, BUT ALL 256 POSSIBLE CHARACTER VALUES WILL BE COVERED. ÓPECIAL CODES LIKE "PAGE UP", ETC. SHOULD HELP IN STANDARDIZING CONTROL KEYSTROKES FOR APPLICATIONS. ÔHE KEY CODE IS RETURNED IN THE ACCUMULATOR. ÎO ERRORS ARE POSSIBLE. ÎÁÍÅ : CONCOLOR ÁÒÇÓ : .Á = WHICH COLORS TO MODIFY: $02=CHARACTER + $01=CURSOR + $80=MODIFY HIGH-ATTRIBUTES OF COLORS .Ø = NEW ÒÇÂÉ CHARACTER COLOR .Ù = NEW ÒÇÂÉ CURSOR COLOR ÒÅÔÕÒÎÓ: .Ø = RESULTING CHARACTER COLOR .Ù = RESULTING CURSOR COLOR ÁÌÔÅÒÓ : .Á ÓETS THE CHARACTER AND CURSOR COLORS TO BE USED BY THE CONSOLE FOR THE "READ" AND "WRITE" SYSTEM CALLS THAT REFER TO FILES OPENED TO THE CONSOLE DEVICE. ÙOU CAN USE THE FLAGS ARGUMENT TO LIMIT WHAT GETS CHANGED. [ÎOTE: FLAGS ARGUMENT IS SLIGHTLY DIFFERENT IN ÒELEASE #9]. ÎÁÍÅ : CONPALETTE ÁÒÇÓ : ÒÅÔÕÒÎÓ: SW+0 = MAIN CHARACTER COLOR SW+1 = CURSOR COLOR SW+2 = STATUS CHARACTER COLOR SW+3 = SEPARATOR CHARACTER COLOR SW+4 = HIGHLIGHT CHARACTER COLOR SW+5 = ALERT CHARACTER COLOR SW+6 = SCREEN BORDER COLOR SW+7 = SCREEN BACKGROUND COLOR ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÒETURNS THE PALETTE OF COLORS THAT ARE RECOMMENDED TO BE USED IN APPLICATIONS. ÔHESE COLORS ARE CHOSEN BY THE USER IN THE SYSTEM CONFIGURATION, SO THEY CAN BE INTERPRETED AS BEING WHAT THE USER WANTS AND EXPECTS APPLICATIONS TO USE. Á DIFFERENT SELECTION IS MADE BY THE USER FOR EACH DIFFERENT SCREEN TYPE, AND THE PALETTE RETURNED WILL BE FOR THE SCREEN TYPE CURRENTLY IN USE. ÔHE HIGH-ATTRIBUTE BITS OF THESE COLORS ARE VALID. ÅIGHT COLORS ARE INCLUDED IN THE PALETTE, AND YOU MAY INTERPRET THEIR MEANING ACCORDING TO THE APPLICATION. ÔHE SUGGESTED USAGES ARE GIVEN IN THE RETURN ARGUMENTS LISTED ABOVE. ÎÁÍÅ : CONSCREEN ÁÒÇÓ : .Á = NUMBER OF TEXT ROWS REQUIRED, MINIMUM .Ø = NUMBER OF TEXT COLUMNS REQUIRED, MINIMUM ÒÅÔÕÒÎÓ: .Á = NUMBER OF TEXT ROWS YOU GET .Ø = NUMBER OF TEXT COLUMNS YOU GET .ÃÓ = ERROR OCCURRED FLAG (REQUESTED SIZE CANNOT BE GIVEN) ÁÌÔÅÒÓ : .Ù, ERRNO ÔHIS CALL SELECTS AN APPROPRIATE DISPLAY DEVICE, SCREEN, AND LAYOUT FOR DISPLAYING TEXT. ÙOU ASK FOR THE MINIMUM NUMBER OF ROWS AND COLUMNS YOU REQUIRE ON THE SCREEN, AND THE CALL RETURNS TO YOU WHAT YOU RECEIVE. ÉF THE SYSTEM CANNOT MATCH YOUR MINIMUM REQUIREMENTS, AN ERROR WILL BE RETURNED, AND THE CURRENT SCREEN WILL BE UNCHANGED. ÔHE CLOCK SPEED OF THE PROCESSOR WILL BE CHANGED TO MATCH THE SCREEN SELECTED, IF APPROPRIATE. ÎÁÍÅ : CONPOS ÁÒÇÓ : .Á = ROW .Ø = COLUMN ÒÅÔÕÒÎÓ: .ÃÓ = ERROR ENCOUNTERED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÔHIS CALL WILL SET THE SCREEN LOCATION THAT THE NEXT CONSOLE "READ" OR "WRITE" SYSTEM CALL WILL OPERATE FROM. ÉF THE "CURSOR" POSITION IS OUTSIDE THE BOUNDARIES OF THE CURRENT WINDOW ON THE SCREEN, AN ERROR WILL BE RETURNED. [ÎOTE: THIS FUNCTION IS NOT IMPLEMENTED IN ÒELEASE #9]. 2.6. ÐÒÏÃÅÓÓ ÃÏÎÔÒÏÌ ÃÁÌÌÓ ÔHIS SECTION DESCRIBES CALLS THAT ARE USED TO CONTROL THE EXECUTION OF PROCESSES (ACTIVE PROGRAMS). ÆROM WITHIN ONE PROGRAM, YOU CAN CALL FOR THE EXECUTION OF ANOTHER PROGRAM, HAVE IT EXECUTE, AND THEN RETURN TO THE CALLING PROGRAM. ÓINCE ONLY ONE PROGRAM IS ALLOWED IN MEMORY AT A TIME, SOME SPECIAL PROBLEMS ARISE. ÁLSO, ONLY RUDIMENTARY VERSIONS OF THESE SYSTEM CALLS ARE IMPLEMENTED IN ÒELEASE #9 AND É HAVEN'T DECIDED COMPLETELY HOW THEY SHOULD WORK. ÓO, THIS SECTION IS A BIT TENTATIVE. ÎÁÍÅ : EXEC ÐÕÒÐÏÓÅ: EXECUTE EXTERNAL PROGRAM AS A CHILD PROCESS ÁÒÇÓ : (ZP) = PROGRAM NAME OF EXECUTABLE (ZW) = START ADDRESS OF ARGUMENT VECTOR .ÁÙ = NUMBER OF ARGUMENTS [MP] = POINTER TO FAR MEMORY VOLATILE STORAGE ÒÅÔÕÒÎÓ: .Á = EXIT CODE .Ø = NUMBER OF BYTES IN "ACEÅXITÄATA" USED [MP] = POINTER TO FAR MEMORY VOLATILE STORAGE .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ù, ERRNO ÃALLING THIS ROUTINE WILL CAUSE A NEW "FRAME" TO BE SET UP ON THE "SYSTEM STACK" (LOWERING THE AVAILABLE APPLICATION AREA MEMORY A LITTLE), THE SPECIFIED PROGRAM TO BE LOADED INTO MEMORY OVER TOP OF THE CURRENT ONE, THE NEW PROGRAM TO BE EXECUTED, THE OLD PROGRAM TO BE RELOADED FROM WHATEVER DISK UNIT IT CAME FROM ORIGINALLY UPON EXIT OF THE NEW PROGRAM, AND CONTROL TO BE RETURNED TO THE OLD PROCESS WITH THE RETURN VALUES FROM THE EXECUTED PROGRAM. ÔHIS IS A COMPLICATED PROCEDURE AND MANY THINGS CAN GO WRONG. ÔHE FIRST THING THAT A PROCESS THAT WANTS TO CALL ANOTHER PROGRAM MUST DO IS SET UP THE ARGUMENTS TO BE PASSED IN. ÁLL ARGUMENTS MUST BE NULL-TERMINATED STRINGS. ÔHESE ARGUMENTS ARE TO BE PUT INTO HIGH MEMORY, STARTING FROM ONE LESS THAN THE LOCATION POINTED TO BY "ACEÍEMÔOP" AND WORKING DOWNWARD. ÉT DOES NOT MATTER IN WHICH ORDER THE STRINGS ARE PLACED, AS LONG AS THEY ARE ALL GROUPED TOGETHER. ÔHEN, IMMEDIATELY BELOW THE STRINGS COMES THE VECTOR OF TWO-BYTE ÒÁÍ0 POINTERS THAT POINT TO THE STRINGS. ÔHIS ARRAY MUST BE IN ORDER, WITH THE LOWEST ENTRY POINTING TO THE FIRST (ZERO SUBSCRIPT) STRING, ETC., THE SECOND HIGHEST ENTRY POINTING TO THE LAST STRING, AND THE HIGHEST ENTRY CONTAINING THE VALUE $0000. ÁN ASCIIGRAM FOLLOWS: ÈÉÇÈÅÒ ÁÄÄÒÅÓÓÅÓ Ü Ü Ü Ü <--(ACEÍEMÔOP) +-----------+ Ü Ü Ü STRING Ü Ü Ü : COLLECTION OF NULL-TERMINATED STRINGS Ü CONTENTS Ü Ü Ü Ü Ü +-----------+ Ü $0000 Ü : ARGV[Î] : NULL ARGUMENT POINTER +-----------+ Ü STRPTRÎ-1 Ü : ARGV[Î-1] +-----------+ Ü STRPTRÎ-2 Ü : ARGV[Î-2] +-----------+ . . . . +-----------+ Ü STRPTR 1 Ü : ARGV[1] : FIRST ACTUAL ARGUMENT +-----------+ Ü STRPTR 0 Ü <--(ZW) : ARGV[0] : FILENAME OF PROGRAM TO BE EXECUTED +-----------+ Ü Ü ÌÏ×ÅÒ ÁÄÄÒÅÓÓÅÓ ÔHE FIRST ENTRY SHOULD INDICATE THE FILENAME OR COMMAND NAME OF THE PROGRAM BEING EXECUTED, AND THE SUBSEQUENT ARGUMENTS ARE THE ACTUAL INPUT ARGUMENTS TO THE PROGRAM BEING CALLED. ÔHE ADDRESS OF THE FIRST ARGUMENT VECTOR TABLE ENTRY IS LOADED INTO (ZW), AND THE NUMBER OF ARGUMENTS IS LOADED INTO .ÁÙ. ÎOTE THAT THIS VALUE ALSO INCLUDES THE COMMAND NAME, SO IF, FOR EXAMPLE, YOU WERE TO CALL PROGRAM "WC" TO COUNT TWO FILENAMES "HELLO" AND "GOODBYE", THEN YOU WOULD PASS AN ARGUMENT COUNT OF 3. ÔHE NAME POINTED TO BY "ARGV[0]" DOES NOT ACTUALLY HAVE TO BE THE LITERAL COMMAND NAME, BUT THE ONE POINTED TO BY (ZP) DOES. ÉF A RELATIVE EXECUTABLE NAME IS GIVEN IN (ZP), THEN THE SEARCH PATH WILL BE USED TO LOCATE THE EXECUTABLE. ÏH, DON'T SCREW UP THE ORGANIZATION OF THE ARGUMENTS OR BAD THINGS WILL HAPPEN; THERE IS NO STRUCTURE CHECKING. ÁFTER SETTING UP THE ARGUMENTS, YOU'LL WANT TO SET UP ANY REDIRECTIONS OF STDIN, STDOUT, OR STDERR YOU'LL BE NEEDING. ÂECAUSE THERE IS ONLY ONE OPEN FILE TABLE IN THE WHOLE UNI-TASKING SYSTEM, YOU'LL HAVE TO MANIPULATE EXISTING ENTRIES USING THE "FDSWAP" SYSTEM CALL DESCRIBED EARLIER. ÔHE OPEN FILE TABLE IS INHERITED BY THE CHILD PROCESS. ÎOTE THAT IF IT CLOSES ANY OF THE OPEN FILES IT INHERITED, THEN THEY ARE ALSO CLOSED TO YOUR USE ALSO. ÉF THE CHILD ACCIDENTALLY LEAVES OPEN ANY FILES IT OPENED, THEY WILL BE CLOSED BY THE SYSTEM BEFORE YOU ARE REACTIVATED. ÆINALLY, BEFORE THE CALL IS MADE, YOU HAVE TO SAVE ANY VOLATILE LOCAL INFORMATION INTO "FAR" MEMORY. ÁLL APPLICATION ZEROPAGE AND APPLICATION AREA MEMORY WILL BE MODIFIED BY THE CALLED PROGRAM, SO YOU MUST SAVE WHATEVER YOU WILL NEED TO CONTINUE AFTER THE RETURN TO BE ABLE TO CONTINUE. ÁS MENTIONED EARLIER, ALL OF THE "FAR" MEMORY THAT A PARENT PROGRAM OWNS WILL BE SAFE, SO YOU CAN SAVE YOUR VOLATILE INFORMATION THERE, IN ANY FORMAT YOU WISH. ÁLL YOU HAVE TO DO IS SAVE THE POINTER TO THE FAR MEMORY INTO THE [MP] POINTER. ÕPON RETURN OF THE CHILD PROCESS, THE VALUE YOU PUT INTO [MP] WILL BE RESTORED, AND YOU CAN THEN RESTORE YOUR VOLATILE INFORMATION OUT OF FAR STORAGE. ÉF YOU WISH TO SAVE NO VOLATILE INFORMATION, THEN YOU CAN JUST LEAVE GARBAGE IN THE [MP] VALUE, SINCE IT WILL NOT BE INTERPRETED BY THE SYSTEM. ÁLRIGHT, SO NOW YOU CALL THE "EXEC" PRIMITIVE, THE CHILD PROGRAM IS LOADED, EXECUTED, AND IT RETURNS. ÁT THIS TIME, THE PARENT PROGRAM (THAT'S YOU) IS RELOADED FROM WHEREVER IT WAS LOADED ORIGINALLY AND YOU ARE RETURNED TO THE INSTRUCTION IMMEDIATELY FOLLOWING THE "JSR EXEC", WITH YOUR PROCESSOR STACK INTACT BUT THE REST OF YOUR VOLATILE STORAGE INVALID. ÅVEN IF THERE IS AN ERROR RETURN (CARRY FLAG SET), YOUR VOLATILE STORAGE WILL STILL NEED TO BE RESTORED, SINCE THE APPLICATION AREA MAY HAVE BEEN OVERWRITTEN BEFORE THE ERROR WAS DISCOVERED. ÉN THE CASE OF AN ERROR RETURN, THE CHILD PROCESS WILL NOT HAVE BEEN EXECUTED. ÉF THE SYSTEM IS UNABLE TO RELOAD THE PARENT PROGRAM (YOU), THEN AN ERROR RETURN IS GIVEN TO YOUR PARENT, AND SO ON, AS FAR BACK AS NECESSARY. (ÔHIS IS A MINOR EXCEPTION TO THE RULE THAT AN ERROR RETURN INDICATES THAT A CHILD DIDN'T EXECUTE; IN THIS CASE, THE CHILD DIDN'T COMPLETE). ÙOU ARE ALSO RETURNED AN "EXIT CODE", WHICH WILL HAVE APPLICATION-SPECIFIC MEANING, ALTHOUGH STANDARD PROGRAMS (E.G., SHELL SCRIPT) INTERPRET THE VALUE AS: 0==NORMAL EXIT, ANYTHING ELSE==ERROR EXIT. ÔHE Ø REGISTER IS ALSO SET TO INDICATE THE AMOUNT OF "ACEÅXITÄATA" THAT IS USED, TO ALLOW FOR MORE COMPLICATED RETURN VALUES. [ÎOTE: ÔHIS CALL IS DIFFERENT IN ÒELEASE #9]. ÎÁÍÅ : EXECSUB ÐÕÒÐÏÓÅ: EXECUTE INTERNAL SUBROUTINE AS A SEPARATE PROCESS ÁÒÇÓ : (ZP) = ADDRESS OF SUBROUTINE (ZW) = ADDRESS OF ARGUMENT VECTOR ÒÅÔÕÒÎÓ: .Á = EXIT CODE .Ø = NUMBER OF BYTES IN "ACEÅXITÄATA" USED .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ù, ERRNO ÔHIS CALL IS VERY SIMILAR TO "EXEC", EXCEPT THAT IT CALLS AN INTERNAL SUBROUTINE RATHER THAN AN EXTERNAL PROGRAM. ÔHUS, YOU DON'T HAVE TO SAVE OR RESTORE YOUR VOLATILE STORAGE, OR WORRY ABOUT LOADING THE CHILD OR RELOADING THE PARENT. ÙOU DO, HOWEVER, SET UP THE ARGUMENTS AND FILE REDIRECTIONS AS YOU WOULD FOR A FULL "EXEC". [ÎOTE: THIS CALL IS DIFFERENT IN ÒELEASE #9]. ÎÁÍÅ : EXIT ÐÕÒÐÏÓÅ: EXIT CURRENT PROGRAM, RETURN TO PARENT ÁÒÇÓ : .Á = EXIT CODE .Ø = NUMBER OF BYTES IN "ACEÅXITÄATA" USED ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : ÔHIS CALL CAUSES THE CURRENT PROGRAM TO EXIT BACK TO ITS PARENT. Á PROGRAM THAT EXITS SIMPLY BY RETURNING TO ITS ENVIRONMENT WILL GIVE BACK AN EXIT CODE OF 0, WHICH SHOULD BE INTERPRETED AS A NORMAL RETURN. ÉF YOU WISH TO INDICATE A SPECIAL RETURN, YOU SHOULD USE SOME EXIT CODE OTHER THAN ZERO. ÍANY UTILITIES WILL INTERPRET NON-ZERO ERROR CODES AS ACTUAL ERRORS AND MAY ABORT FURTHER OPERATIONS BECAUSE OF THIS. ÙOU MAY SET UP A RETURN DATA IN "ACEÅXITÄATA", UP TO 255 BYTES WORTH, AND LOAD THE NUMBER OF BYTES USED INTO .Ø IF YOU WISH. ÉT IS RECOMMENDED THAT THE FIRST FIELD OF THIS DATA BE A SPECIAL IDENTIFIER CODE SO PROGRAMS THAT CANNOT INTERPRET YOUR DATA WILL NOT TRY. ÙOU CANNOT GIVE ANY FAR POINTERS IN YOUR RETURN DATA, SINCE ALL FAR MEMORY ALLOCATED TO YOU WILL BE FREED BY THE SYSTEM BEFORE RETURNING TO YOUR PARENT. ÎÁÍÅ : MEMSTAT ÐÕÒÐÏÓÅ: GET "FAR" MEMORY STATUS PLUS PROCESS ID ÁÒÇÓ : ÒÅÔÕÒÎÓ: .Á = CURRENT PROCESS ID [SW+0]= AMOUNT OF "FAR" MEMORY FREE [SW+4]= TOTAL AMOUNT OF "FAR" MEMORY ÁÌÔÅÒÓ : .Ø, .Ù ÔHIS CALL RETURNS THE CURRENT PROCESS ID, THE NUMBER OF BYTES OF FAR MEMORY CURRENTLY FREE, AND THE TOTAL AMOUNT OF FAR MEMORY. 2.7. ÍÉÓÃÅÌÌÁÎÅÏÕÓ ÃÁÌÌÓ ÎÁÍÅ : UTOA ÐÕÒÐÏÓÅ: CONVERT UNSIGNED 32-BIT NUMBER TO A DECIMAL ÐÅÔÓÃÉÉ STRING ÁÒÇÓ : .Á = MINIMUM LENGTH FOR RETURN STRING .Ø = ZERO-PAGE ADDRESS OF 32-BIT NUMBER (SW+0)= POINTER TO STRING BUFFER TO STORE STRING ÒÅÔÕÒÎÓ: .Ù = LENGTH OF STRING ÁÌÔÅÒÓ : .Á, .Ø ÔHIS IS A UTILITY CALL IN THE KERNEL. ÉT IS REALLY NOT NECESSARY FOR IT TO BE IN THE KERNEL, BUT SO MANY PROGRAMS MAKE USE OF IT THAT IT MAKES SENSE FOR IT TO BE FACTORED OUT. ÙOU GIVE A POINTER TO A 32-BIT UNSIGNED VALUE IN ZERO PAGE MEMORY, A POINTER TO A BUFFER TO STORE THAT STRING THAT IS AT LEAST AS LONG AS NECESSARY TO STORE THE VALUE PLUS THE NULL-CHARACTER TERMINATOR THAT WILL BE PUT ON THE END OF THE STRING, AND A MINIMUM LENGTH VALUE FOR THE STRING. ÉF THE NUMBER REQUIRES FEWER DIGITS THAN THE MINIMUM LENGTH, THE STRING WILL BE PADDED WITH SPACES ON THE LEFT. ÓINCE A 32-BIT QUANTITY CAN ONLY CONTAIN AN MAXIMUM OF TEN DECIMAL DIGITS, THE STRING BUFFER WILL ONLY NEED TO BE A MAXIMUM OF ELEVEN BYTES IN SIZE. ÎÁÍÅ : GETDATE ÐÕÒÐÏÓÅ: GET THE CURRENT DATE AND TIME ÁÒÇÓ : (.ÁÙ) = ADDRESS OF BUFFER TO PUT ÂÃÄ-FORMAT DATE INTO ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÒETURNS THE CURRENT DATE AND TIME IN THE ÂÃÄ FORMAT DESCRIBED IN THE PARAGRAPH ON "ACEÄIRENTÄATE". ÉT PUTS IT INTO THE AT-LEAST-EIGHT-BYTE STORAGE AREA POINTED TO BY (.ÁÙ). ÎÁÍÅ : SETDATE ÐÕÒÐÏÓÅ: SET THE CURRENT DATE AND TIME ÁÒÇÓ : (.ÁÙ) = ADDRESS OF DATE IN ÂÃÄ FORMAT ÒÅÔÕÒÎÓ: ÁÌÔÅÒÓ : .Á, .Ø, .Ù ÓETS THE CURRENT DATE AND TIME IN THE SYSTEM. (.ÁÙ) POINTS TO THE ÂÃÄ DATE STRING WHOSE FORMAT IS DISCUSSED IN THE PARAGRAPH ON "ACEÄIRENTÄATE". ÎO VALIDITY CHECKING IS PERFORMED ON THE DATE GIVEN. ÎÁÍÅ : CMDOPEN ÐÕÒÐÏÓÅ: OPEN COMMAND CHANNEL TO ÃOMMODORE DISK DRIVES ÁÒÇÓ : (ZP) = DEVICE NAME ÒÅÔÕÒÎÓ: .Á = FILE DESCRIPTOR NUMBER .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ø, .Ù, ERRNO ÔHIS "CMD" SET OF SYSTEM CALLS REALLY SHOULD NOT BE PRESENT, BUT THEY WILL BE NEEDED UNTIL THE FULL COMPLEMENT OF DISK-UTILITY SYSTEM CALLS ARE IMPLEMENTED. ÉT IS REALLY NOT RECOMMENDED THAT ANY APPLICATION PROGRAM RELY ON THESE CALLS BEING AROUND VERY LONG. ÔHIS CALL OPENS THE COMMAND CHANNEL ON THE NAMED DEVICE (STANDARD ÁÃÅ DEVICE NAME STRING) AND RETURNS THE FILE DESCRIPTOR NUMBER TO USE THEREAFTER. ÎÁÍÅ : CMDCLOSE ÐÕÒÐÏÓÅ: CLOSE COMMAND CHANNEL TO ÃOMMODORE DISK DRIVES ÁÒÇÓ : .Á = FILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS CLOSES AN OPENED COMMAND CHANNEL TO A DISK DRIVE. ÃLOSING THE STATUS WILL ÎÏÔ AFFECT ANY OTHER OPEN FILES ON THE DISK UNIT AT THE TIME. ÎÁÍÅ : CMDSEND ÐÕÒÐÏÓÅ: SEND COMMAND OVER COMMAND CHANNEL TO ÃOMMODORE DISK DRIVES ÁÒÇÓ : .Ø = FILE DESCRIPTOR NUMBER (.ÁÙ) = POINTER TO NULL-TERMINATED COMMAND STRING ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS SENDS A COMMAND STRING TO A DISK DRIVE. ÓINCE A NULL-TERMINATED STRING REPRESENTATION IS USED, NOT ALL ÃOMMODORE/ÃÍÄ-ÄÏÓ COMMANDS CAN BE SENT, BUT THE IMPORTANT ONES CAN BE. ÎÁÍÅ : CMDSTATUS ÐÕÒÐÏÓÅ: RECEIVE CURRENT STATUS FROM COMMAND CHANNEL OF ÃOMMODORE DISK DRIVES ÁÒÇÓ : .Ø = FILE DESCRIPTOR NUMBER (.ÁÙ) = POINTER TO BUFFER FOR NULL-TERMINATED STATUS STRING ÒÅÔÕÒÎÓ: .Á = STATUS CODE IN BINARY .ÃÓ = ERROR OCCURRED ÁÌÔÅÒÓ : .Ø, .Ù, ERRNO ÔHIS RETURNS THE STATUS OF A DISK DRIVE IN A STRING AS WELL AS THE BINARY DISK STATUS NUMBER IN THE ACCUMULATOR. ÔHE GIVEN STATUS BUFFER MUST BE AT LEAST 50 OR SO CHARACTERS LONG (WHATEVER IS THE LONGEST POSSIBLE DISK STATUS STRING). 3. ÕÓÅÒ ÐÒÏÇÒÁÍ ÏÒÇÁÎÉÚÁÔÉÏÎ ÔHE ÁÃÅ SYSTEM ITSELF IS WRITTEN USING THE ÂUDDY-128 ASSEMBLER, SO IT IS RECOMMENDED THAT APPLICATIONS BE WRITTEN IN THIS ALSO. ÕSER PROGRAMS FOR ÁÃÅ HAVE A VERY SIMPLE STRUCTURE. ÈERE IS THE STANDARD "HELLO, WORLD" EXAMPLE PROGRAM WRITTEN IN ÂUDDY ASSEMBLER FOR ÁÃÅ: -----=----- .SEQ ACEHEAD.S .ORG ACEÁPPÁDDRESS .OBJ "@0:HELLO" JMP MAIN .BYTE ACEÉÄ1,ACEÉÄ2,ACEÉÄ3 MAIN = * LDA #HELLOÍSG STA ZP+0 STY ZP+1 LDA #HELLOÍSGÅND-HELLOÍSG LDX #STDOUT JSR WRITE RTS HELLOÍSG = * .ASC "ÈELLO, CRUEL WORLD." .BYTE 13 HELLOÍSGÅND = * -----=----- ÔHIS WOULD NORMALLY BE PUT INTO A FILE CALLED "HELLO.S". ÔHE ".S" EXTENSION MEANS THAT THIS IS AN ASSEMBLER FILE (A LA ÕNIX). ÔHE FIRST THING THIS PROGRAM DOES IS INCLUDE THE "ACEHEAD.S" FILE. ÔHIS IS THE ÂUDDY ASSEMBLER FILE THAT CONTAINS THE HEADER INFORMATION DECLARATIONS REQUIRED TO ACCESS THE ÁÃÅ SYSTEM INTERFACE. ÔHE NEXT LINE GIVES THE START ADDRESS TO START ASSEMBLING TO; IT MUST BE "ACEÁPPÁDDRESS", WHICH IS THE ADDRESS THAT ÁÃÅ WILL LOAD THE PROGRAM AT. ÔHE NEXT LINE IS A DIRECTIVE TO THE ASSEMBLER TO WRITE THE EXECUTABLE CODE TO A ÃOMMODORE-ÄÏÓ "ÐÒÇ" FILE NAMED "HELLO". ÔHIS WILL BE THE COMMAND TO ENTER AT THE ÁÃÅ SHELL PROMPT. ÔHE NEXT SIX BYTES OF OBJECT CODE (WHICH ARE THE FIRST SIX BYTES OF A PROGRAM) DESCRIBE THE HEADER REQUIRED BY ÁÃÅ PROGRAMS. ÔHE FIRST THREE BYTES MUST BE A ÊÍÐ TO THE MAIN ROUTINE OF THE PROGRAM. ÔHE NEXT THREE BYTES MUST HAVE THE VALUES "ACEÉÄ1", "ACEÉÄ2", AND "ACEÉÄ3", RESPECTIVELY. ÁND THAT'S ALL THERE IS TO IT. ÔHE REST OF THE PROGRAM CAN BE ORGANIZED HOWEVER YOU WANT IT TO BE. ÉN THIS EXAMPLE, WE SET UP THE ARGUMENTS FOR THE "WRITE" SYSTEM CALL TO PRINT THE STRING "ÈELLO, CRUEL WORLD." PLUS A CARRIAGE RETURN TO STANDARD OUTPUT. ÎOTE THAT THIS STRING DOES NOT NEED A TERMINATING NULL ($00) CHARACTER SINCE THE WRITE CALL TAKES A BUFFER LENGTH. ÔHE PROGRAM THEN RETURNS TO ITS CALLING ENVIRONMENT VIA AN ÒÔÓ. ÔHIS WILL CAUSE AN IMPLIED "EXIT(0)" TO BE PERFORMED BY THE SYSTEM, RETURNING TO THE PARENT PROGRAM. ÁLTHOUGH THIS PROGRAM DOES NOT TAKE ADVANTAGE OF THIS, AN APPLICATION PROGRAM MAY USE ZERO-PAGE LOCATIONS $0002 THROUGH $007F FOR STORAGE WITHOUT FEAR OF HAVING THE STORAGE TRODDEN UPON BY THE SYSTEM. ÁLSO, THE PROCESSOR STACK MAY BE USED FROM THE POINT IT WAS AT UPON ENTRY TO YOUR PROGRAM ALL THE WAY DOWN TO THE BOTTOM. É WILL BE DOING SOMETHING ABOUT ENSURING THERE IS ALWAYS ENOUGH PROCESSOR SPACE FOR AN APPLICATION TO USE IN THE FUTURE, BUT FOR NOW, ALL APPLICATIONS HAVE TO SHARE THE